/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package game;

import entity.Round;
import entity.Player;
import java.awt.Graphics;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Nguyễn Dức Trung
 */
public class Game implements Runnable {
  
    public Game(RotateHat r,int CountGamer,int CountRound) {
        this.CountGamer = CountGamer;
        this.r=r;
        this.CountRound=CountRound;
        this.Round(CountRound);
        this.player();
        
        game = new Thread(this);
        game.start();
       
        
    }
    public void Round(int count){
        round = new Round[count];
        for(int i=0;i<count;i++){
        round[i] = new Round(i+1,null);
        }        
        this.setCurrenRound(round[0]);
    }
    
  
    /**
     * Khởi tạo người chơi
     */
    public void player(){
       nplayer = new Player[this.CountGamer];
       for(int i=0;i<this.CountGamer;i++){
            nplayer[i]=new Player("Player "+(i+1),i,0,3,0,0,false,false,false,0);
            In("Khởi tạo người chơi: "+nplayer[i].getName());
            if(nplayer[i].getPosition()==0){
            nplayer[i].setIsPlay(true);
        //    In("Người chơi "+nplayer[i].getName()+" chơi đầu tiên");
            this.setPlayer(this.nplayer[i]);
            }
       }
         In("Vòng"+ this.CurrenRound.getNameRound());
       
       
   }
  
   
    /**
     * 
     * @param result
     * @return Trả về true nếu người chơi được đoán chữ cái <br /> Trả về false nếu người chơi không được đoán
     */
    public boolean  FilterResults(int result){
        if(result>3){
        return true; 
        }else{      
        return false;
        } 
    }
    /**
     * Xây dựng phương thức chơi game
     * @param player 
     * đối tượng của class Player<br />
     */
     public void PlayGame(){
       
     for(int i=0;i<this.CountGamer;i++){
             if(nplayer[i].isIsWin()){                
                    In(this.nplayer[i].getName()+" dành chiến thắng ở vòng "+this.CurrenRound.getNameRound());          
                    nplayer[i].setCountWin(nplayer[i].getCountWin()+1);
                    this.CurrenRound.setPlaywin(nplayer[i]);
                    nplayer[i].setTotal_score(nplayer[i].getTotal_score()+nplayer[i].getScore());
                    In(nplayer[i].getName()+" chiến thắng với : "+nplayer[i].getTotal_score()+" điểm ");
                    this.NextRound();
             }else{
                 if(this.CountLose==this.CountGamer){
                     In("Tất cả mọi người đều không đoán được ô chữ");
                     this.NextRound();
                 }else{
                     if(this.nplayer[i].isIsPlay()){
                               this.setPlayerCurrent(nplayer[i]);
                               if(!r.isIsRotate()&&r.isNext()){
                                        if(!nplayer[i].isIsLose()){
                                        if(i<(this.CountGamer-1)){
                                            setNextPlayer(nplayer[i+1]);
                                        }else{
                                            setNextPlayer(nplayer[0]);
                                        }
                                        }else{
                                             
                                        }
                                        Result(r.getStatus()); 
                                        Gamer(nplayer[i]);
                                        this.setTimeOut(3000);
                                        if(FilterResults(getResult())){  
                                        setIsAnswer(true);
                                        if(next) {
                                            this.hasAnswer();
                                         r.setIsRotate(true);   
                                         next=false;
                                        }
                                        }else{
                                        setIsAnswer(false);
                                        notAnswer();
                                        r.setNext(false);                                        
                                        r.setIsRotate(true);   
                                        }
   
                                        }
                    }                     
                }              
            }
        } 
    }
     /**
      * 
      * @param player
      */
    public void Gamer(Player player){
        this.setPlayer(player);
        player.MinusTurn();
      
    }
    /**
     * Xử lý phần chơi khi người chơi được đoán đáp án
     */
    public void hasAnswer(){
        if(this.checkAnswer(player.getAnswer())){
          if(count<2){
            In("Trả lời đúng");
            switch(this.Result){
                case 4:player.DivScore();break;
                case 5:player.MultiScore();break;
                case 6:player.AddTurn();break;
                default:
                    player.AddScore(this.Result);
            }
            player.setTurn(3);
            player.setAdd_turn(player.getAdd_turn()+1);
            In("Hiện "+player.getName()+" có "+player.getScore()+" điểm ");
            In(player.getName()+" tiếp tục quay ");
          }else{
          player.setIsWin(true);
          }
         //this.getCurrentPlayer().setIsPlay(true);
        }else{
           
            player.setTurn(player.getTurn()-1);
            In("Trả lời sai ");
            In("Hiện "+player.getName()+" có "+player.getScore()+" điểm ");
            In("Hiện "+player.getName()+" có "+player.getTurn()+" lượt chơi ");
            if(player.getAdd_turn()<0){
                player.setIsPlay(false);
                if(player.getTurn()==0){
               //     this.setTimeOut(2000);
                    player.setIsLose(true);
                    In(player.getName()+" bị loại khỏi vòng "+this.CurrenRound.getNameRound());
                    this.CountLose++;
                }else{
                    player.setAdd_turn(0);
                    
                }
                if(this.CountLose<this.CountGamer){
                    this.setTimeOut(3000);
                    this.FindNextPlayer(); 
                    In("Người chơi tiếp theo : "+this.NextPlayer.getName());
                }
                
            }else{
             //   this.setTimeOut(3000);
                In(player.getName()+" tiếp tục quay ");    
                player.setTurn(player.getTurn()+1);
            }
            // Kết thúc đoạn if-else thể hiện việc chuyển người chơi tiếp theo
            this.next=false;
        }
       
    // Kết thúc if-else thể hiện việc người chơi đoán  ô chữ
    }
    /**
     * Xử lý phần chơi khi người chơi không được đoán đáp án
     */
    public void notAnswer(){
     //   this.setTimeOut(1000);
        this.click=true;
       
        switch(this.Result){
           case 1: In("Bạn bị mất lượt");break;
           case 2: player.AddScore(0);break;
           case 3: In("Bạn quay được ô may mắn");
       }
       if(player.getAdd_turn()<0){
           //     this.setTimeOut(2000);
                player.setIsPlay(false);
                this.FindNextPlayer();
                In("Người chơi tiếp theo : "+this.NextPlayer.getName());
                player.setAdd_turn(0);
            }else{
          //      this.setTimeOut(2000);
                In(player.getName()+" tiếp tục quay ");    
            }
    }
      /**
     * @param status Trạng thái của nón sau khi quay được
     * @return Trả lại kết quả quay được của nón <br />
     * Kết quả đặc biệt  
     * <p>1: Mất lượt</p>
     * <p>2: Mất điểm</p>
     * <p>3: May mắn</p>
     * <p>4: Chia đôi </p>
     * <p>5: Nhân đôi</p>
     * <p>6: Thêm lượt</p>
     * <p>Còn lại là điểm số</p>
     */
     public int Result(int status){
        int result=0;
        switch(status){
         case 0:result=100;    break;  
         case 1:result=600;    break; 
         case 2:result=4;      break; 
         case 3:result=700;    break;    
         case 4:result=450;    break;
         case 5:result=350;    break;
         case 6:result=800;    break;
         case 7:result=1;      break;    
         case 8:result=300;    break;
         case 9:result=400;    break;
         case 10:result=3;     break;
         case 11:result=2;     break;    
         case 12:result=900;   break;
         case 13:result=300;   break;
         case 14:result=500;   break;
         case 15:result=6;     break;    
         case 16:result=300;   break;
         case 17:result=400;   break;
         case 18:result=550;   break;
         case 19:result=5;     break;    
         case 20:result=500;   break;    
         case 21:result=300;   break; 
         case 22:result=500;   break;
         case 23:result=600;   break;     
         case 24:result=100;   break;                  
        }
        this.Result=result;
        return this.Result;
    }
    /**
     *
     */
    public void Reset(){
        for(int i=0;i<this.CountGamer;i++){
            this.nplayer[i].setAdd_turn(0);
            this.nplayer[i].setScore(0);
            this.nplayer[i].setIsWin(false);
            this.nplayer[i].setIsLose(false);
            this.nplayer[i].setAnswer(null);
            this.nplayer[i].setTurn(3);
            this.nplayer[i].setAdd_turn(0);
        
        }
        this.CountLose=0;
    }
    public void NextRound(){
        this.Reset();
        if(this.CurrenRound.getNameRound()<=this.CountRound){            
            this.setTimeOut(2000);
            this.setCurrenRound(round[this.CurrenRound.nameNextRound()]);
            this.nplayer[0].setIsPlay(true);
            this.NextPlayer=nplayer[1];
            In("Bắt đầu vòng "+this.CurrenRound.getNameRound());
            In(this.nplayer[0].getName()+" chơi đầu tiên ");            
        }else{            
            this.setTimeOut(2000);
            In("Trò chơi kết thúc");
            InfoGame();
          
        }
    }
    public void InfoGame(){       
        
        for(int i=0; i<this.CountRound;i++){
        In("Vòng" +round[i].getNameRound());
        if(round[i].getPlaywin()!=null){
        In("Người chiến thắng :"+round[i].getPlaywin().getName());
        In("Tổng điểm"+ round[i].getPlaywin().getTotal_score());
        }else{
        In("Không có ai chiến thắng");
        }
        In("----------------------------");
        }
        for(int i=0;i<this.CountGamer;i++){
            In("Người chơi "+this.nplayer[i].getName()+", tổng điểm "+nplayer[i].getTotal_score()+", số lần thắng "+ nplayer[i].getCountWin());
        }
       
    }
    /**
     * Gán người chơi chiến thắng
     * @param player 
     */
   
    public void setWin(Player player){
        this.setTimeOut(2000);
        this.PlayerWin=player;
        this.PlayerWin.setTotal_score(player.getTotal_score());
    }
    /**
     * 
     * @param abc
     * @return
     */
    public boolean checkAnswer(String abc){
       
        String a[]={"N","G","U","Y","Ê","M"};
       
        for(int i=0;i<6;i++){
        if(a[i].equals(abc)){ 
             count++;
            return true;
            }
        
      }
        
     return false;   
    }
    public boolean checkNextPlayer(){
        if(this.NextPlayer.isIsLose()){
        return false;
        }else{
        return true;
        }
    }
   public void FindNextPlayer(){
     int countLose=0;
     while(countLose<=this.CountGamer){
         if(!this.NextPlayer.isIsLose()){
             this.NextPlayer.setIsPlay(true);
             break;
         }else{
             countLose++;
         if(this.NextPlayer.getPosition()<this.CountGamer-1){
             this.NextPlayer=nplayer[this.NextPlayer.getPosition()+1];
         }else{
            this.NextPlayer=nplayer[0];
            }
         }
     }
   }
    public void setTimeOut(int time){
        try {
            game.sleep(time);
        } catch (InterruptedException ex) {
            Logger.getLogger(Game.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    /**
     * 
     * @param player
     */
    public void Next(Player player){
        player.setIsPlay(true);
    }
    /**
     * 
     * @param player
     */
    public void Win(Player player){
        player.setIsWin(true);
    }

    /**
     * 
     * @return
     */
    public Player getPlayer() {
        return player;
    }

    /**
     * 
     * @param player
     */
    public void setPlayer(Player player) {
        this.player = player;
    }

    /**
     * 
     * @return
     */
    public Player getNextPlayer() {
        return NextPlayer;
    }

    /**
     * 
     * @param NextPlayer
     */
    public void setNextPlayer(Player NextPlayer) {
        this.NextPlayer = NextPlayer;
    }
    /**
     * 
     * @param abc
     */
    public void In(String abc){
    System.out.println(abc);
    
    
    }

    /**
     * 
     * @return
     */
    public boolean isClick() {
        return click;
    }

    /**
     * 
     * @param click
     */
    public void setClick(boolean click) {
        this.click = click;
    }

    /**
     * 
     * @return
     */
    public int getResult() {
        return Result;
    }

    /**
     * 
     * @param Result
     */
    public void setResult(int Result) {
        this.Result = Result;
    }

    /**
     * 
     * @return
     */
    public boolean isIsAnswer() {
        return isAnswer;
    }

    /**
     * 
     * @param isAnswer
     */
    public void setIsAnswer(boolean isAnswer) {
        this.isAnswer = isAnswer;
    }
  
    public int getCountGamer() {
        return CountGamer;
    }

    public void setCountGamer(int CountGamer) {
        this.CountGamer = CountGamer;
    }

    public int getCountLose() {
        return CountLose;
    }

    public void setCountLose(int CountLose) {
        this.CountLose = CountLose;
    }

    public Player[] getNplayer() {
        return nplayer;
    }

    public void setNplayer(Player[] nplayer) {
        this.nplayer = nplayer;
    }

    public Player getPlayerCurrent() {
        return playerCurrent;
    }

    public void setPlayerCurrent(Player playerCurrent) {
        this.playerCurrent = playerCurrent;
    }

    public int getCountRound() {
        return CountRound;
    }

    public void setCountRound(int CountRound) {
        this.CountRound = CountRound;
    }

    public boolean isNext() {
        return next;
    }

    public void setNext(boolean next) {
        this.next = next;
    }

    public static String getMessage() {
        return message;
    }

    public static void setMessage(String message) {
        Game.message = message;
    }

    public Round getCurrenRound() {
        return CurrenRound;
    }

    public void setCurrenRound(Round CurrenRound) {
        this.CurrenRound = CurrenRound;
    }

    public Round[] getRound() {
        return round;
    }

    public void setRound(Round[] round) {
        this.round = round;
    }
    
    

   
   
    
    public void run() {
       while(true){
        PlayGame();
       }
    }
    private Player player;
    private Player playerCurrent;
    private Player[] nplayer;
    private Player NextPlayer;
    private Player PlayerWin;
    private int Result;
    private boolean click;
    private boolean isAnswer;
    private int CountGamer;
    private int CountLose;
    private int CountRound;
    public int count=0;
    private RotateHat r;
    private boolean next;
    private Round CurrenRound;
    
    public int arraySelect[]=
    {
    1,1,1,1,1,1,1,1,1,1,
    1,1,1,1,1,1,1,1,1,1,
    1,1,1,1,1,1,1,1,1
    };
    private List list;
    private static String message;
    public Thread game;
    public Round[] round;
}
